package leetcode.code0065;

import leetcode.IDebug;
import leetcode.helper.HelpDebug;

public class Solution implements IDebug {

	public boolean isNumber(String s) {
		int len = s.length();
		char[] chars = s.toCharArray();
		Integer e = null; // （可选）一个 'e' 或 'E'
		Integer dot = null;
		Integer symbol1 = null;// e前符号
		Integer symbol2 = null;// e后符号
		for (int i = 0; i < len; i++) {
			char c = chars[i];
			if (c == 'e' || c == 'E') {
				if (i == len - 1 || i == 0) {// 第一个和最后一个不行
					return false;
				}
				if (e == null) {
					e = i;
				} else {
					return false;// 只能有一个`e`或者`E`
				}
			} else if (c == '.') {
				if (dot == null) {
					if (e != null && i > e) {
						return false; // 点不允许出现在e之后
					}
					dot = i;
				} else {
					return false;// 只能有一个点 `.`，出现不止一次，错了
				}
			}
//			else if (c == ' ') {
//				return false;// 不允许出现空格
//			}
			else if (c == '+' || c == '-') {
				if (e == null && symbol1 == null) {// 出现第一个符号
					symbol1 = i;
				} else if (e != null && symbol2 == null) {
					symbol2 = i;
				} else {
					return false;
				}
			} else if (c < '0' || c > '9') {
				return false;
			}
		}
		int end = len - 1;
		if (e != null) {
			// 检查e后面
			// （可选）一个 'e' 或 'E' ，后面跟着一个 整数
			// chars在[e+1,len-1]范围上是一个整数吗
			boolean b1 = this.isInteger(chars, e + 1, end, symbol2);
			if (!b1) {
				return false;
			}
			end = e - 1;
		}
		if (dot != null) {
			if (!this.isFloat(chars, 0, end, symbol1, dot)) {
				return false;
			}
		} else {
			if (!(this.isInteger(chars, 0, end, symbol1)))
				return false;
		}
		return true;
	}

	private boolean isFloat(char[] chars, int start, int end, Integer symbol, Integer dot) {
		if (symbol != null) {// 有符号
			if (!(chars[start] == '+' || chars[start] == '-')) {// 第一个必须是符号
				return false;
			}
			start++;
			if (start > end) {// 符号后面没有数，错了
				return false;
			}
		}
//		if (dot == null) {
//			return false;
//		}
		if (!(dot >= start + 1 || dot <= end - 1)) {
			return false;
		}
		return true;
	}

	private boolean isInteger(char[] chars, int start, int end, Integer symbol) {
		if (symbol != null) {// 有符号
			if (!(chars[start] == '+' || chars[start] == '-')) {// 第一个必须是符号
				return false;
			}
			start++;
			if (start > end) {// 符号后面没有数，错了
				return false;
			}
		}
		return true;
	}

	@Override
	public void debug1() {
		// true
		String[] str = HelpDebug.str2array2(
				"[\"2\", \"0089\", \"-0.1\", \"+3.14\", \"4.\", \"-.9\", \"2e10\", \"-90E3\", \"3e+7\", \"+6e-1\", \"53.5e93\", \"-123.456e789\"]");
		for (String s : str) {
			System.out.println(s.trim() + " " + this.isNumber(s.trim()));
		}
	}

	@Override
	public void debug2() {
		// true
		System.out.println(".1".trim() + " " + this.isNumber(".1".trim()));
		System.out.println("-.1".trim() + " " + this.isNumber("-.1".trim()));
		System.out.println("005047e+6".trim() + " " + this.isNumber("005047e+6".trim()));
		System.out.println("46.e3".trim() + " " + this.isNumber("46.e3".trim()));
		System.out.println(".2e81".trim() + " " + this.isNumber(".2e81".trim()));
	}

	@Override
	public void debug3() {
		// false
		String[] str1 = HelpDebug.str2array2("[\"abc\", \"1a\", \"1e\", \"e3\", \"99e2.5\", \"--6\", \"-+3\", \"95a54e53\"]");
		for (String s : str1) {
			System.out.println(s.trim() + " " + !this.isNumber(s.trim()));
		}

	}

	@Override
	public void debug4() {
		System.out.println(".".trim() + " " + !this.isNumber(".".trim()));
		System.out.println("+e".trim() + " " + !this.isNumber("+e".trim()));
		System.out.println("+3. e04116".trim() + " " + !this.isNumber("+3. e04116".trim()));
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();
		so.debug4();

	}

}
